home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-15 / ports.zip / PORTS.ASM < prev   
Assembly Source File  |  1992-12-28  |  12KB  |  257 lines

  1. ;
  2. ;
  3. TITLE PORTS.ASM
  4. ;
  5. ;       Purpose: Diagnostic tool to monitor up to 16 ports and display
  6. ;                data being received from them.
  7. ;
  8. ;       Created: 02-OCT-1987    Richard B. Johnson
  9. ;
  10. ;       Note(s): This program must be assembled as a '.COM' file.
  11. ;                MASM PORTS;
  12. ;                LINK PORTS;
  13. ;                EXE2BIN PORTS.EXE PORTS.COM
  14. ;                DEL PORTS.EXE
  15. ;
  16. ;       Modified:
  17. ;               Added provision to write a fixed byte to the ports before
  18. ;               reading the port.                       03-OCT-1987 (RBJ)
  19. ;
  20. CR      EQU     0DH
  21. LF      EQU     0AH
  22. MS_DOS  EQU     21H                     ; DOS SOFTWARE INTERRUPT
  23. VIDEO   EQU     10H                     ; VIDEO ROM BIOS INTERRUPT
  24. KBD     EQU     16H                     ; KEYBOARD ROM BIOS INTERRUPT
  25. ;
  26. PSEG    SEGMENT PARA PUBLIC 'CODE'
  27.         ASSUME CS:PSEG, DS:PSEG, ES:PSEG, SS:NOTHING
  28.         ORG     100H
  29. MAIN    PROC    NEAR
  30.         CALL    CLS                             ; CLEAR THE SCREEN
  31.         MOV     SI,OFFSET PRP1                  ; POINT TO PROMPT
  32.         MOV     DI,OFFSET PORTS                 ; WHERE ARE PORT LOCATIONS
  33. GETINP: CALL    DISPLAY                         ; DISPLAY PROMPT
  34.         CALL    CONIN                           ; GET INPUT ASCII
  35.         JZ      NOMORE                          ; NO MORE INPUT
  36.         CALL    PARSE                           ; PARSE INPUT STRING
  37.         STOSW                                   ; SAVE PORT ADDRESS
  38.         INC     BYTE PTR [NUM_PRT]              ; NEXT
  39.         MOV     SI,OFFSET PRP2                  ; POINT TO SECOND PROMPT
  40.         JMP     SHORT GETINP                    ; AND CONTINUE GETTING DATA
  41. NOMORE: MOV     SI,OFFSET PRP4                  ; POINT TO WANT TO WRITE?
  42.         CALL    DISPLAY                         ; PRINT TO SCREEN
  43.         CALL    CONIN                           ; GET BUFFERED RESPONSE
  44.         JZ      NOWRT                           ; NOTHING TYPED
  45.         MOV     AL,BYTE PTR [CONBUF+2]          ; GET TYPED BYTE
  46.         AND     AL,95                           ; MAY TO UPPER CASE
  47.         CMP     AL,'Y'                          ; WAS IT WRITE?
  48.         JNZ     NOWRT                           ; NO
  49.         MOV     BYTE PTR [WFLAG],-1             ; YES, SET THE FLAG
  50.         MOV     SI,OFFSET PRP6                  ; POINT TO 'ENTER BYTE'
  51.         CALL    DISPLAY                         ; PRINT TO SCREEN
  52.         CALL    CONIN                           ; GET EDITED STRING
  53.         CALL    PARSE                           ; RETURN BINARY FROM HEX
  54.         MOV     BYTE PTR [OBYTE],AL             ; SAVE THE BYTE FOR WRITE
  55. NOWRT:  CALL    CLS                             ; CLEAR THE SCREEN
  56.         CALL    KIL_CUR                         ; KILL CURSOR
  57.         MOV     SI,OFFSET PRP5                  ; POINT TO 'HIT ANY KEY'
  58.         CALL    DISPLAY                         ; PRINT TO SCREEN
  59. AGAIN:  CALL    DPORTS                          ; DISPLAY PORTS
  60.         MOV     AH,1                            ; CHECK FOR ABORT
  61.         INT     KBD
  62.         JZ      AGAIN                           ; NO ABORT
  63.         MOV     AH,0                            ; GET INPUT BYTE
  64.         INT     KBD                             ; FLUSH AND EXIT
  65.         JMP     FINIS
  66. MAIN    ENDP
  67. ;
  68. ;       Convert HEX word in AX to string addressed by DI.
  69. ;
  70. HEXW    PROC    NEAR
  71.         PUSH    AX                              ; SAVE WORD
  72.         MOV     AL,AH                           ; HIGH BYTE INTO AL
  73.         CALL    HEX                             ; CONVERT
  74.         POP     AX                              ; FALL THROUGH
  75. ;
  76. ;       Convert binary in AL to hexadecimal string addressed by DI
  77. ;
  78. HEX     PROC    NEAR                            ; CONVERT BYTE IN AL TO HEX
  79.         MOV     AH,AL                           ; SAVE A COPY
  80.         ROL     AL,1                            ; SHIFT OVER FOUR BITS
  81.         ROL     AL,1
  82.         ROL     AL,1
  83.         ROL     AL,1
  84.         CALL    HEX2
  85.         MOV     AL,AH                           ; GET BYTE BACK
  86. HEX2:   AND     AL,0FH                          ; MASK HIGH BITS
  87.         ADD     AL,90H                          ; MAKE LIKE PACKED DECIMAL
  88.         DAA                                     ; ADJUST (OLD INTEL TRICK)
  89.         ADC     AL,40H                          ; ISOLATE A-F
  90.         DAA                                     ; 0 - A REMOVED
  91.         STOSB                                   ; SAVE ASCII
  92.         RET
  93. HEX     ENDP
  94. HEXW    ENDP
  95. ;
  96. ;       Return Binary in AX from HEX ASCII string addressed by SI.
  97. ;
  98. PARSE   PROC    NEAR
  99.         MOV     SI,OFFSET CONBUF + 1            ; POINT TO BYTE COUNT
  100.         LODSB                                   ; GET BYTES TYPED
  101.         MOV     CL,AL                           ; USE AS COUNT
  102.         XOR     CH,CH                           ; ZERO HIGH BYTE
  103.         XOR     BX,BX                           ; START WITH ZERO
  104.         XOR     AH,AH                           ; SAME HERE
  105. PAR1:   SHL     BX,1                            ; * 2
  106.         SHL     BX,1                            ; * 4
  107.         SHL     BX,1                            ; * 8
  108.         SHL     BX,1                            ; * 16
  109.         LODSB                                   ; GET BYTE
  110.         SUB     AL,'0'                          ; ASCII BIAS
  111.         JC      EXIT                            ; CHECK RANGE
  112.         CMP     AL,10                           ; LESS THAN 10?
  113.         JC      LRANGE                          ; YES, LOW RANGE
  114.         AND     AL,95                           ; MAP TO UPPER CASE
  115.         SUB     AL,7                            ; MUST BE A-F
  116.         CMP     AL,16                           ; MORE THAN 15?
  117.         JNC     EXIT                            ; YES, BAD
  118. LRANGE: ADD     BX,AX                           ; ACCUMULATE
  119.         LOOP    PAR1                            ; PICK UP ALL INPUT
  120. EXIT:   MOV     AX,BX                           ; GET RESULT
  121.         RET
  122. PARSE   ENDP
  123. ;
  124. ;       Put edited console text in a buffer called CONBUF
  125. ;
  126. CONIN   PROC    NEAR
  127.         MOV     BYTE PTR [CONBUF],5             ; MAX CHARACTERS
  128.         MOV     DX,OFFSET CONBUF                ; POINT TO BUFFER
  129.         MOV     AH,0AH                          ; BUFFERED INPUT
  130.         INT     MS_DOS
  131.         CMP     BYTE PTR [CONBUF+1],0           ; CHECK FOR ANYTHING TYPED
  132.         RET
  133. CONIN   ENDP
  134. ;
  135. ;       Print on the screen ASCII characters addressed by SI until a null.
  136. ;
  137. DISPLAY PROC    NEAR
  138.         MOV     BX,1Eh                          ; ATTRIBUTE (yellow/blue)
  139. DISP:   LODSB                                   ; GET BYTE
  140.         OR      AL,AL                           ; TEST FOR NULL
  141.         JZ      DONE                            ; END OF STRING
  142.         MOV     AH,14                           ; DUMB TERMINAL MODE
  143.         INT     VIDEO                           ; ROM BIOS
  144.         JMP     SHORT DISP                      ; CONT
  145. DONE:   RET
  146. DISPLAY ENDP
  147. ;
  148. ;       Display all the selected ports.
  149. ;
  150. DPORTS  PROC    NEAR
  151.         MOV     AH,2                            ; SET CURSOR POSITION
  152.         XOR     BX,BX                           ; PAGE ZERO
  153.         MOV     DX,0500H                        ; ROW FIVE/COL ZERO
  154.         INT     VIDEO
  155.         MOV     CL,BYTE PTR NUM_PRT             ; GET NUMBER OF PORTS
  156.         XOR     CH,CH                           ; ZERO HIGH BYTE
  157.         JCXZ    NONE                            ; NO PORTS
  158.         MOV     SI,OFFSET PORTS                 ; POINT TO PORT LOCATIONS
  159. DPOR:   LODSW                                   ; GET PORT ADDRESS
  160.         PUSH    CX                              ; SAVE COUNT
  161.         PUSH    SI                              ; SAVE PORT ADDRESS
  162.         MOV     DX,AX                           ; SAVE IN DX
  163.         MOV     DI,OFFSET HPORT                 ; POINT TO ASCII STRING SPACE
  164.         CALL    HEXW                            ; CONVERT HEX WORD
  165.         CMP     BYTE PTR [WFLAG],0              ; WANT TO WRITE?
  166.         JZ      NOWAY                           ; DON'T WRITE
  167.         MOV     AL,BYTE PTR [OBYTE]             ; GET OUTPUT BYTE
  168.         OUT     DX,AL                           ; OUTPUT THE BYTE
  169.         PUSH    AX                              ; EXERCISE
  170.         POP     AX
  171. NOWAY:  IN      AL,DX                           ; GET BYTE AT PORT
  172.         MOV     DI,OFFSET VPORT                 ; POINT TO VALUE IN STRING
  173.         CALL    HEX                             ; CONVERT TO HEX
  174.         MOV     SI,OFFSET PRP3                  ; POINT TO STRING
  175.         CALL    DISPLAY                         ; DISPLAY ON SCREEN
  176.         POP     SI                              ; RESTORE PORT LOC
  177.         POP     CX                              ; RESTORE COUNT
  178.         LOOP    DPOR                            ; CONTINUE
  179. NONE:   RET
  180. DPORTS  ENDP
  181. ;
  182. ;       Clear the screen.
  183. ;
  184. CLS     PROC    NEAR
  185.         MOV     AX,0600H                ;ERASE/SCROLL SCREEN
  186.         MOV     DH,24                   ;25TH ROW
  187.         MOV     DL,79                   ;80TH COLUMN
  188.         XOR     CX,CX                   ;HOME POSITION
  189.         MOV     BH,7
  190.         INT     VIDEO
  191.         MOV     AH,2                    ;SET CURSOR POSITION
  192.         XOR     DX,DX                   ;UPPER LEFT HAND CORNER
  193.         MOV     BH,0                    ;PAGE ZERO
  194.         INT     VIDEO
  195.         RET
  196. CLS     ENDP
  197. ;
  198. FINIS   PROC    NEAR
  199.         MOV     SI,OFFSET PEXIT         ; POINT TO 'EXIT' STRING
  200.         CALL    DISPLAY                 ; PRINT TO SCREEN
  201.         CALL    RES_CUR                 ; RESTORE CURSOR
  202.         MOV     AX,4C00H                ; RETURN TO DOS EXIT CODE 00
  203.         INT     MS_DOS
  204.         CLI                             ; IN CASE ITS BROKE
  205.         HLT                             ; HARD STOP
  206. FINIS   ENDP
  207. ;
  208. ;       Save cursor type and then remove it.
  209. ;
  210. KIL_CUR PROC    NEAR
  211.         MOV     AH,3                            ; CURSOR POOSITION/TYPE
  212.         XOR     BX,BX                           ; PAGE ZERO
  213.         INT     VIDEO
  214.         MOV     WORD PTR [CURSOR],CX            ; SAVE CURSOR TYPE
  215.         MOV     CX,-1                           ; MAKE DISAPPEAR
  216.         MOV     AH,1                            ; SET CURSOR TYPE
  217.         INT     VIDEO
  218.         RET
  219. KIL_CUR ENDP
  220. ;
  221. ;       Restore cursor.
  222. ;
  223. RES_CUR PROC    NEAR
  224.         MOV     CX,WORD PTR [CURSOR]            ; MAKE NEW AGAIN
  225.         MOV     AH,1                            ; SET CURSOR TYPE
  226.         INT     VIDEO
  227.         RET
  228. RES_CUR ENDP
  229. ;
  230. NUM_PRT DB      0                               ; NUMBER OF PORTS
  231. WFLAG   DB      0                               ; WRITE FLAG
  232. OBYTE   DB      0                               ; OUTPUT BYTE
  233. PORTS   DW      16 DUP(0)
  234. ;
  235. PRP1    DB      CR,LF
  236. HEAD    DB      27 DUP(' ')
  237.         DB      '-  Port diagnostic tool  -'
  238.         DB      CR,LF
  239.         DB      CR,LF,'Enter [Return] only to complete address list.'
  240. PRP2    DB      CR,LF,'Enter port address(s) (HEX) : ',0
  241. PRP3    DB      CR,LF,'Port '
  242. HPORT   DB      'FFFF = '
  243. VPORT   DB      'FF',0
  244. LEN     EQU     $ - PRP3
  245. PRP4    DB      CR,LF,'Write to the port(s)  Y/N ? ',0
  246. PRP6    DB      CR,LF,'Enter byte to write (HEX) : ',0
  247. PRP5    DB      CR,LF,'Hit any key to quit.',0
  248. PEXIT   DB      CR,LF,LF,'End.',CR,LF,0
  249. CURSOR  DW      ?
  250. CONBUF  LABEL   BYTE
  251. ;
  252. PSEG    ENDS
  253.         END     MAIN
  254.        DB      CR,LF,'Hit any key to quit.',0
  255. PEXIT   DB      CR,LF,LF,'End.',CR,LF,0
  256. CURSOR
  257.